﻿using System.Web.UI.WebControls;
using WebHelper;
using WebHelper.Controles;
using WebHelper.Controles.Interfaces;
using System;
using Ext.Net;

namespace IU.Generico
{
    public delegate void SelectedNodeDelegate(string nodo);

    public partial class ControlArbolLite : ControlGenerico, ITitulo
    {
        AbstractNodo raiz;
        public AbstractNodo Raiz
        {
            get { return raiz; }
            set { raiz = value; }
        }

        public int Width
        {
            get { return (int)tree.Width.Value; }
            set { tree.Width = Unit.Pixel(value); }
        }

        public int Height
        {
            get { return (int)tree.Width.Value; }
            set { tree.Width = Unit.Pixel(value); }
        }

        public event SelectedNodeDelegate AlSeleccionarNodo = null;

        /// <summary>
        /// 
        /// </summary>
        public override void OnShow()
        {
            FantasmearControl(null);
        }

        /// <summary>
        /// Al hacer un click en un nodo.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        [DirectMethod]
        protected void OnClick_Node(object sender, DirectEventArgs e)
        {
            try
            {
                if(AlSeleccionarNodo != null)
                    AlSeleccionarNodo(TreeSelectionModel.SelectedNode.Text);
            }
            catch { }
        }

        /// <summary>
        /// Llama a la función de generación de nodos.
        /// </summary>
        /// <param name="st"></param>
        public override void FantasmearControl(Storer st)
        {
            if (Raiz != null)
            {
                if (Raiz.GetType() == typeof(Nodo))
                    tree.Root.Add(GenerarNodo((Nodo)Raiz));
                else
                    tree.Root.Add(GenerarNodo((NodoLite)Raiz));
            }
        }

        public void ResetearArbol()
        {
            Raiz = null;
            tree.Root.Clear();
            FantasmearControl(null);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nodo"></param>
        /// <returns></returns>
        protected Ext.Net.TreeNode GenerarNodo(Nodo nodo)
        {
            Ext.Net.TreeNode root = new Ext.Net.TreeNode(nodo.Nombre);
            foreach (object o in nodo.ObtenerEntidades())
            {
                Storer st = new Storer(nodo.Tipo, o);
                Ext.Net.TreeNode child = new Ext.Net.TreeNode(
                    st.GetValue(nodo.AtributoId).ToString(),
                    nodo.GetTitulo(st),
                    Ext.Net.Icon.None);
                child.Leaf = true;
                root.Nodes.Add(child);
            }
            foreach (var hijo in nodo.Hijos)
            {
                if (hijo.GetType() == typeof(Nodo))
                    root.Nodes.Add(GenerarNodo((Nodo)hijo));
                else
                    root.Nodes.Add(GenerarNodo((NodoLite)hijo));
            }
            return root;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nodo"></param>
        /// <returns></returns>
        protected Ext.Net.TreeNode GenerarNodo(NodoLite nodo)
        {
            Ext.Net.TreeNode root = new Ext.Net.TreeNode(nodo.Nombre);
            foreach (object o in nodo.ObtenerEntidades())
            {
                Storer st = new Storer(o.GetType(), o);
                Ext.Net.TreeNode child = new Ext.Net.TreeNode(
                    st.GetValue(nodo.AtributoId).ToString(),
                    nodo.GetTitulo(st),
                    Ext.Net.Icon.None);
                child.Leaf = true;
                root.Nodes.Add(child);
            }
            foreach (var hijo in nodo.Hijos)
            {
                if (hijo.GetType() == typeof(Nodo))
                    root.Nodes.Add(GenerarNodo((Nodo)hijo));
                else
                    root.Nodes.Add(GenerarNodo((NodoLite)hijo));
            }
            return root;
        }

        #region ITitulo Members

        public string Titulo
        {
            get
            {
                return tree.Title;
            }
            set
            {
                tree.Title = value;
            }
        }

        #endregion
    }
}